package com.ellwood.framework.config.mybatis.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

/**
 * @ProjectName: Ellwood-framework-boot
 * @PackageName: com.ellwood.framework.config.mybatis
 * @ClassName: MyMetaObjectHandler
 * @Description: // 自动填充配置  --  实现对create_time、update_time等的值自动插入和更新
 * @Author: Ellwood
 * @CreateDate: 2024/7/15 - 下午2:37
 * @Version: V1.0.0
 */
@Configuration
public class MyMetaObjectHandler implements MetaObjectHandler {

    private final static String CREATE_BY = "createBy";
    private final static String CREATE_TIME = "createTime";
    private final static String UPDATE_BY = "updateBy";
    private final static String UPDATE_TIME = "updateTime";
    private final static String IS_STATE = "isState";
    private final static String VERSION = "version";
    private final static String IS_DELETED = "isDeleted";


    @Override
    public void insertFill(MetaObject metaObject) {

        // 自动填充状态字段，先检查字段是否已经设置了值，如果没有设置则设置默认值
        Object fieldValue = getFieldValByName(IS_STATE, metaObject);
        if (fieldValue == null) {
            setFieldValByName(IS_STATE, 0, metaObject);
        }

        /*UserEntity user=new UserEntity();
        user.setUserId(1L)*/

        // 自动填充乐观锁version字段
        this.strictInsertFill(metaObject, VERSION, Integer.class, 1);

        // 创建者 // TODO 权限控制完成之后再进行设置,这里先写死，后面进行根据登录者进行设置
        this.setFieldValByName(CREATE_BY, 3L, metaObject);

        //  自动填充create_time字段
        this.setFieldValByName(CREATE_TIME, new Date(), metaObject);

        // 更新者  // TODO 权限控制完成之后再进行设置,这里先写死，后面进行根据登录者进行设置
        this.setFieldValByName(UPDATE_BY, 3L, metaObject);

        //  自动填充create_time、update_time字段
        this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);

        // 删除标识
        strictInsertFill(metaObject, IS_DELETED, Integer.class, 0);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新者  // TODO 权限控制完成之后再进行设置,这里先写死，后面进行根据登录者进行设置
        this.setFieldValByName(UPDATE_BY, 3L, metaObject);

        this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
    }

}
